package bancosys.tec.utils.db.executor;

import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;

/**
 * Interface para DbExecutors. Define como um DbExecutor é configurado e como é executado.
 * 
 * @author jrenaut
 */
public interface DbExecutor {

    /**
     * Configura este executor. Informa qual foi o dataSource especificado e o arquivo com o script de criação do BD.
     * 
     * @param dataSource O DataSource
     * @param schemaFile O arquivo de schema
     */
    void configure(BasicDataSource dataSource, URL schemaFile);

    /**
     * Configura este executor. Informa qual foi o dataSource especificado, o arquivo com o script de criação do BD e o mapa de parâmetros
     * fornecidos.
     * 
     * @param dataSource O DataSource
     * @param schemaFile O arquivo de schema
     * @param parameters O mapa de parâmetros
     */
    void configure(BasicDataSource dataSource, URL schemaFile, Map<String, String> parameters);

    /**
     * Configura este executor. Informa qual conexão utilizar e o arquivo com o script de criação do BD.
     * 
     * @param connection A conexão
     * @param schemaFile O arquivo de schema
     */
    void configure(Connection connection, URL schemaFile);

    /**
     * Configura este executor. Informa qual conexão utilizar, o arquivo com o script de criação do BD e o mapa de parâmetros fornecidos.
     * 
     * @param connection A conexão
     * @param schemaFile O arquivo de schema
     * @param parameters O mapa de parâmetros
     */
    void configure(Connection connection, URL schemaFile, Map<String, String> parameters);

    /**
     * Executa o script.
     * 
     * @throws CouldNotExecuteException quando ocorre erro na execução do script.
     */
    void execute() throws CouldNotExecuteException;

    /**
     * Template de método para execução do script.
     * 
     * @param dropBefore apaga todas as tableas quando <code>true</code>, não apaga quando <code>false</code>.
     * @throws CouldNotExecuteException quando nao consegue executar o script.
     */
    void execute(boolean dropBefore) throws CouldNotExecuteException;

    /**
     * Dropa as tabelas do banco de dados configurado neste executor
     * 
     * @throws CouldNotExecuteException Se não conseguir executar o drop
     */
    void drop() throws CouldNotExecuteException;

    /**
     * @param scriptFilenamePattern regex para o nome dos arquivos que devem ser executados
     */
    void setScriptPattern(String scriptFilenamePattern);

    /**
     * @param toUpper <code>true</code> se deve forcar queries para upper antes de executa-las, <code>false</code> se nao.
     */
    void setToUpper(boolean toUpper);

    /**
     * Executa o statement no statement.
     * 
     * @param statement statement
     * @throws SQLException SQLException
     */
    void executeSingleStatement(String statement) throws SQLException;

    /**
     * Devolve o char delimitardor
     * 
     * @return char
     */
    char getDelimiterChar();

    /**
     * Converte um statment isoladamente
     * 
     * @param statement String
     * @return String
     */
    String convertStatement(String statement);

}
